import axios from 'axios';
import { notification } from 'antd'; // 引入 Ant Design 的通知组件
import { baseURL } from './base'; // 引入基础URL配置

// 配置默认选项
axios.defaults.timeout = 5000; // 超时时间
axios.defaults.baseURL = baseURL; // 配置请求地址

// 设置请求拦截器
axios.interceptors.request.use(
  config => {
    // 设置通用头部
    config.headers = {
      'Content-Type': 'application/json;charset=UTF-8',
      'tenant-id': '1'
    };

    // 添加 token 到请求头
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }

    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 设置响应拦截器
axios.interceptors.response.use(
  response => {
    const res = response.data;

    // 检查响应状态码
    if (res.code === 0) {
      return res;
    } else if (res.code === 401) {
      // 处理特定的状态码
      showNotification({msg:'登录已过期，请重新登录'});
      // 清除本地存储中的token
      localStorage.removeItem('token');

      // 跳转到登录页面
      window.location.href = '/login';
      return Promise.reject(res);
    } else   {
      // 显示错误通知
      if (response.config.showNotification !== false) {
        showNotification(res);
      }
      
    }  
  },
  error => {
     return Promise.reject(error);
  }
);

/**
 * 显示通知
 * @param {Object} res 响应数据
 */
function showNotification(res) {
  notification.error({
    message: '错误',
    description: res.message || res.msg, // 更改为 message
    duration: 3, // 持续时间
    placement: 'topRight', // 显示位置
  });
}

/**
 * 统一请求方法
 * @param {Object} options 请求配置对象
 * @returns {Promise}
 */
export function request(options) {
  const { method, url, params, showNotification, ...rest } = options;

  // 根据请求方法决定如何处理参数
  const requestConfig = {
    method,
    url,
    ...(method.toLowerCase() === 'post' || method.toLowerCase() === 'put' ? { data: params } : { params }),
    showNotification: showNotification !== undefined ? showNotification : true, // 默认显示通知
    ...rest
  }; 

  return new Promise((resolve,reject) =>{
    axios(requestConfig)
    .then(res => {
        resolve(res)
        console.log(res)
    }).catch(error => {
      // 这里可以选择性地处理错误，例如记录日志或执行其他操作
      // 但是最终还是需要返回一个Promise，以便调用者可以在catch中处理错误
        reject(error);
    });
  })  
    
}

export default request;